package com.taxis.service;

import java.util.Iterator;
import java.util.List;
import org.hibernate.*;
import com.taxis.common.*;
import com.taxis.model.Peticion;
import com.taxis.model.Unidad;
import com.taxis.model.Taxista;

public class UnidadDaoService {

	private List<Unidad> unidades;
	private Unidad unidad;
	private Taxista taxista;

	public UnidadDaoService(){ }

	public void insertUnidad(Unidad u) throws Exception{
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try{
			tx = session.beginTransaction();
			session.save(u);
			tx.commit();
		}catch(RuntimeException re){
			if(u != null){
				tx.rollback();
			}
			throw re;
		}finally{
			session.close();
		}
	}

	@SuppressWarnings("unchecked")
	public List<Unidad> getAllUnidades() {
		Session session = HibernateUtil.currentSession();
		try {
			Query q = session.getNamedQuery("getAllUnidades");
			unidades = (List<Unidad>)q.list();
			return unidades;
		} catch(Exception e) {
			System.out.println("Error while fetching UNIDADES");
			e.printStackTrace();
			return null;
		} finally {
			session.close();        	
		}
	}

	public Unidad getUnidad(Integer idUnidad) throws Exception {
		Session session = HibernateUtil.currentSession();
		try {
			return (Unidad)session.get(Unidad.class, idUnidad);
		} finally {
			session.close();
		}
	}

	public void updateUnidad(Unidad u) throws Exception {
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.update(u);
			tx.commit();
		} catch(RuntimeException re) {
			if(u != null)
				tx.rollback();
			throw re;
		} finally {
			session.close();
		}
	}

	public void deleteUnidad(Integer idUnidad, List<Taxista> taxistas) throws Exception {
		Session session = HibernateUtil.currentSession();
		Transaction tx = null;
		try {
			System.out.println("en try de deleteUnidad");
			tx = session.beginTransaction();
			Iterator<Taxista> it = taxistas.iterator();
			while(it.hasNext()){
				it.next().setUnidad(null);
			}
			unidad = (Unidad)session.load(Unidad.class, idUnidad);
			session.delete(unidad);
			tx.commit();
		} catch (RuntimeException e) {
			if(unidad != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public Unidad findByTaxista(Integer idtaxista) {
		Session session = HibernateUtil.currentSession();
		try {
			SQLQuery query = session.createSQLQuery("SELECT * from unidad inner join taxista on unidad.id_unidad = taxista.id_unidad where taxista.id_taxista=:idtaxista");
			query.addEntity(Unidad.class);
			query.setInteger("idtaxista",idtaxista);
			Unidad u = (Unidad)query.uniqueResult();
			return u;
		} catch(Exception e) {
			System.out.println("Error while fetching TAXISTAS");
			e.printStackTrace();
			return null;
		} finally {
			session.close();        	
		}
	}
}